/*
 * name:验证方式选择 CheckTypeSelect
 * author:yanmu.wj@taobao.com
 * date:2011-11-23
 */
KISSY.add('CheckTypeSelect',function(S,Tip){
    var CheckTypeSelect = function(cfg){
        this.select = cfg.select && S.one(cfg.select);
        this.container = cfg.container && S.one(cfg.container);
        this.typeCls = cfg.typeCls || '';
        this.from = cfg.from && S.one(cfg.from);
        this.formTip = cfg.formTip && S.one(cfg.formTip) ? Tip(cfg.formTip) : null;

        //tag隐藏域 验证类型通过隐藏域发送
        this.tag = cfg.tag && S.one(cfg.tag);
        //allCheckers须提供reset接口方法，供验证切换时调用
        this.allCheckers = S.isObject(cfg.allCheckers) ? cfg.allCheckers : null;

        //对外接口，返回实际已组合校验器
        this.checkers = [];
    };
    var _CheckTypeSelect = function(cfg){
        return new CheckTypeSelect(cfg);
    };
    S.augment(CheckTypeSelect,{
        init:function(){
            if(!this.select || !this.container || !this.typeCls || !this.from || !this.allCheckers) return this;

            var self = this;
            this.change(this.select.val());
            this.select.on('change',function(){
                self.change();
            });

            return this;
        },
        change:function(){
            this.reset();
            var type = this.select.val().split('_'),
                tag = S.one(this.select[0].options[this.select[0].selectedIndex]).attr('data-tag');

            if(this.tag && !!tag) this.tag.val(tag);
            
            for(var i=0,l=type.length;i<l;i++){
                var obj = S.one(this.allCheckers[type[i]].id);
                if(obj){
                    this.container.append(obj);
                    this.checkers.push(this.allCheckers[type[i]].checker);
                }
            }
        },

        //将container中的type重置回from容器
        back:function(){
            var types = this.container.all(this.typeCls);
            var self = this;
            S.each(types,function(item){
                self.from.append(item);
            });
        },
        //验证方式改变时，调用各自校验器reset
        reset:function(){
            this.back();
            this.checkers = [];
            this.formTip && this.formTip.hide()
            for(var k in this.allCheckers){
                this.allCheckers[k].checker.reset();
            }
        },

        //返回实际选择校验器
        getCheckers:function(){
            return this.checkers;
        }
    });

    return _CheckTypeSelect;
},{
    requires:['Message']
});
